home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / workbench / wbstartemu / src / library.c next >
C/C++ Source or Header  |  1999-11-29  |  8KB  |  348 lines

  1.  
  2. /*
  3. **
  4. **    wbstart.library emulation v44
  5. **    © 1999 by Stephan Rupprecht
  6. **    All Rights reserved
  7. **
  8. */
  9.  
  10. #include <exec/resident.h>
  11. #include <exec/initializers.h>
  12. #include <exec/execbase.h>
  13. #include <exec/libraries.h>
  14. #include <exec/memory.h>
  15. #include <workbench/workbench.h>
  16. #include <workbench/startup.h>
  17. #include <dos/dos.h>
  18.  
  19. #include <inline/exec.h>
  20. #include <inline/wb.h>
  21. #include <inline/utility.h>
  22. #include <inline/dos.h>
  23.  
  24. #include "library.h"
  25.  
  26. #define SysBase            WBStartBase->wbsb_SysBase
  27. #define WorkbenchBase    WBStartBase->wbsb_WorkbenchBase
  28. #define UtilityBase        WBStartBase->wbsb_UtilityBase
  29. #define DOSBase            WBStartBase->wbsb_DOSBase
  30.  
  31. #ifndef BPTR
  32. #define BPTR        ULONG
  33. #endif
  34.  
  35. #define REG(r)        __asm( #r )
  36. #define VERSION        2
  37. #define REVISION    2
  38.  
  39. /****************************************************************************/
  40.  
  41.  struct Library *LibInit(ULONG Segment REG(a0), struct WBStartBase *WBStartBase REG(d0), struct Library * REG(a6));
  42.  struct Library *LibOpen(struct WBStartBase *WBStartBase REG(a6));
  43.  ULONG LibExpunge(struct WBStartBase *WBStartBase REG(a6));
  44.  ULONG LibClose(struct WBStartBase *WBStartBase REG(a6));
  45.  LONG LibExtFunc(void);
  46.  BOOL L_OpenLibs( struct WBStartBase *WBStartBase );
  47.  VOID L_CloseLibs( struct WBStartBase *WBStartBase );
  48.  LONG WBStartTagList( struct TagItem *tlist REG(a0), struct WBStartBase *WBStartBase REG(a6) );
  49.  
  50. /****************************************************************************/
  51.  
  52. ULONG LibVectors[] =
  53. {
  54.     (ULONG)LibOpen,
  55.     (ULONG)LibClose,
  56.     (ULONG)LibExpunge,
  57.     (ULONG)LibExtFunc,
  58.     (ULONG)LibExtFunc,
  59.     (ULONG)WBStartTagList,
  60.     (ULONG)-1L
  61. };
  62.  
  63. UBYTE    LibName[] = "wbstart.library",
  64.         LibID[] = "wbstart.library 44.1 (22.10.99) emulation (C) 1999 by Stephan Rupprecht";
  65.  
  66. ULONG LibInitTab[] =
  67. {
  68.     (ULONG) sizeof(struct WBStartBase),
  69.     (ULONG) LibVectors,
  70.     (ULONG) NULL,
  71.     (ULONG) LibInit
  72. };
  73.  
  74. struct Resident ROMTag =     /* do not change */
  75. {
  76.     RTC_MATCHWORD,
  77.      &ROMTag,
  78.      &ROMTag + 1,
  79.     RTF_AUTOINIT,
  80.      VERSION,
  81.     NT_LIBRARY,
  82.      0,
  83.     LibName,
  84.     LibID,
  85.     (APTR)&LibInitTab
  86. };
  87.  
  88. /****************************************************************************/
  89.  
  90. LONG nop(void)
  91. {
  92.     return(-1L);
  93. }
  94.  
  95. /****************************************************************************/
  96.  
  97. LONG LibExtFunc(void)
  98. {
  99.     return(0L);
  100. }
  101.  
  102. /****************************************************************************/
  103.  
  104. #if 0
  105. void kprintf( STRPTR FormatStr, ... )
  106. {
  107.     #undef SysBase
  108.     struct Library    *SysBase = (*(struct Library **)4L);
  109.     TEXT    PutChData[64];
  110.     STRPTR    p = PutChData;
  111.     
  112.     RawDoFmt(FormatStr, ((STRPTR)(&FormatStr))+4, (void (*)())"\x16\xc0\x4e\x75", PutChData);
  113.     
  114.     do RawPutChar( *p );
  115.     while( *p++ );
  116.     #define SysBase    WBStartBase->wbsb_SysBase
  117. }
  118. #else
  119. #define kprintf(...)
  120. #endif
  121.  
  122. /****************************************************************************/
  123.  
  124. struct Library *
  125.   LibInit(ULONG Segment REG(a0), struct WBStartBase *WBStartBase REG(d0), struct Library *ExecBase REG(a6))
  126. {
  127.     kprintf( "LibInit()\n" );
  128.  
  129.     SysBase = ExecBase;
  130.     WBStartBase->LibSegment = Segment;
  131.     WBStartBase->LibNode.lib_Revision = REVISION;
  132.     
  133.     InitSemaphore( &WBStartBase->wbsb_LibLock );
  134.     ObtainSemaphore( &WBStartBase->wbsb_LibLock );
  135.     
  136.     if( ((struct ExecBase *)ExecBase)->AttnFlags & AFF_68020 )
  137.     {    
  138.         if( L_OpenLibs( WBStartBase ) )
  139.         {    
  140.             kprintf( "LibInit()- ok\n" );
  141.             ReleaseSemaphore( &WBStartBase->wbsb_LibLock );
  142.             return((struct Library *)WBStartBase);             
  143.         }
  144.         
  145.         L_CloseLibs( WBStartBase );
  146.     }
  147.  
  148.     ReleaseSemaphore( &WBStartBase->wbsb_LibLock );
  149.  
  150.     FreeMem((BYTE *)WBStartBase-WBStartBase->LibNode.lib_NegSize, 
  151.         WBStartBase->LibNode.lib_NegSize + WBStartBase->LibNode.lib_PosSize);
  152.     
  153.     kprintf( "LibInit() - error\n" );
  154.     
  155.     return(NULL);
  156. }
  157.  
  158. /****************************************************************************/
  159.  
  160. struct Library *  LibOpen(struct WBStartBase *WBStartBase REG(a6))
  161. {    
  162.     kprintf( "LibOpen()\n" );
  163.     ObtainSemaphore( &WBStartBase->wbsb_LibLock );
  164.     WBStartBase->LibNode.lib_Flags &= ~LIBF_DELEXP;
  165.     WBStartBase->LibNode.lib_OpenCnt++;
  166.     ReleaseSemaphore( &WBStartBase->wbsb_LibLock );
  167.     kprintf( "LibOpen() - okay\n" );
  168.     return((struct Library *)WBStartBase);
  169. }
  170.  
  171. /****************************************************************************/
  172.  
  173. ULONG  LibExpunge(struct WBStartBase *WBStartBase REG(a6))
  174. {
  175.     ULONG    retval = NULL;
  176.     kprintf( "LibExpunge()\n" );
  177.     ObtainSemaphore( &WBStartBase->wbsb_LibLock );
  178.     
  179.      if( WBStartBase->LibNode.lib_OpenCnt )  
  180.     {
  181.         WBStartBase->LibNode.lib_Flags |= LIBF_DELEXP;
  182.         kprintf( "LibExpunge() - still in use\n" );
  183.     }
  184.     else
  185.     {                        
  186.         L_CloseLibs( WBStartBase );
  187.             
  188.          Remove((struct Node *)WBStartBase);
  189.  
  190.         FreeMem((BYTE *)WBStartBase-WBStartBase->LibNode.lib_NegSize,
  191.               WBStartBase->LibNode.lib_NegSize + WBStartBase->LibNode.lib_PosSize);
  192.  
  193.         retval = (ULONG) WBStartBase->LibSegment;
  194.         
  195.         kprintf( "LibExpunge() - okay\n" );
  196.     }
  197.         
  198.     ReleaseSemaphore( &WBStartBase->wbsb_LibLock );
  199.  
  200.      return retval;
  201. }
  202.  
  203. /****************************************************************************/
  204.  
  205. ULONG  LibClose(struct WBStartBase *WBStartBase REG(a6))
  206. {    
  207.      ULONG    retval = NULL;
  208.     
  209.     ObtainSemaphore( &WBStartBase->wbsb_LibLock );
  210.     kprintf( "LibClose()\n" );
  211.      if( ! ( WBStartBase->LibNode.lib_OpenCnt ) || ! ( --WBStartBase->LibNode.lib_OpenCnt ) )
  212.      {
  213.          if( WBStartBase->LibNode.lib_Flags & LIBF_DELEXP )
  214.          {
  215.              retval = LibExpunge( WBStartBase );
  216.          }
  217.      }
  218.      
  219.      ReleaseSemaphore( &WBStartBase->wbsb_LibLock );
  220.     kprintf( "LibClose - retval %08lx\n", retval );
  221.      return retval;
  222. }
  223.  
  224. /****************************************************************************/
  225.  
  226.  BOOL L_OpenLibs( struct WBStartBase *WBStartBase )
  227. {
  228.     if(    ( WorkbenchBase = OpenLibrary( "workbench.library", 44L ) ) &&
  229.         ( DOSBase = OpenLibrary( "dos.library", 40L ) ) &&
  230.         ( UtilityBase = OpenLibrary( "utility.library", 40L ) ) )
  231.     {
  232.         return TRUE;
  233.     }
  234.     
  235.     return FALSE;
  236. }
  237.  
  238. /****************************************************************************/
  239.  
  240.  VOID L_CloseLibs( struct WBStartBase *WBStartBase )
  241. {
  242.     CloseLibrary( WorkbenchBase );
  243.     CloseLibrary( DOSBase );
  244.     CloseLibrary( UtilityBase );
  245. }
  246.  
  247. /****************************************************************************/
  248.  
  249.  LONG WBStartTagList( struct TagItem *tlist REG(a0), struct WBStartBase *WBStartBase REG(a6) )
  250. {
  251.     struct TagItem    *ti;
  252.     struct WBArg    *args = NULL;
  253.     STRPTR             name = NULL;
  254.     BPTR             dirlock = NULL;
  255.     ULONG             argc = 0UL, 
  256.                      ret = 20UL;
  257.     
  258.     kprintf( "WBStartTagList() - taglist at %08lx\n", tlist );
  259.     
  260.     while( ti = NextTagItem( &tlist ) )
  261.     {    
  262.         ULONG    data = ti->ti_Data;
  263.     
  264.         switch( ti->ti_Tag )
  265.         {
  266.             case WBStart_Name:
  267.                 name = (STRPTR) data;
  268.                 kprintf( "Name: %s\n", name );
  269.             break;
  270.             
  271.             case WBStart_DirectoryName:
  272.                 if( data )
  273.                 {
  274.                     UnLock( dirlock );                
  275.                     dirlock = Lock( (STRPTR) data, SHARED_LOCK );
  276.                     kprintf( "DirName: %s\n", data );
  277.                 }
  278.             break;
  279.             
  280.             case WBStart_DirectoryLock:
  281.                 UnLock( dirlock );
  282.                 dirlock = DupLock( (BPTR) data );
  283.                 kprintf( "DirLock: %08lx\n", dirlock );
  284.             break;
  285.             
  286.             case WBStart_ArgumentCount:
  287.                 argc = data;
  288.             break;
  289.             
  290.             case WBStart_ArgumentList:
  291.                 args = (struct WBArg *) data;
  292.             break;
  293.         }
  294.     }
  295.     
  296.     if( name )
  297.     {        
  298.         if( argc && args )
  299.         {    
  300.             kprintf( "Args: %ld\n", argc );
  301.         
  302.             if( ti = tlist = AllocVec( 2 * (argc+1) * sizeof( struct TagItem ), MEMF_ANY ) )
  303.             {
  304.                 kprintf( "Alloced %ld bytes at: %08lx\n", 2 * (argc+1) * sizeof( struct TagItem ), tlist );
  305.             
  306.                 while( argc-- )
  307.                 {
  308.                     kprintf( "LOCK: %08lx, NAME: %s\n", args->wa_Lock, args->wa_Name );
  309.                     ti->ti_Tag  = WBOPENA_ArgLock;
  310.                     ti->ti_Data = (ULONG) args->wa_Lock;
  311.                     ti++;
  312.                     ti->ti_Tag  = WBOPENA_ArgName;
  313.                     ti->ti_Data = (ULONG) args->wa_Name;
  314.                     ti++;
  315.                     args++;
  316.                 }                
  317.                 
  318.                 ti->ti_Tag  = TAG_DONE;
  319.             }
  320.             else tlist = (struct TagItem *) -1L;
  321.         }
  322.         else tlist = NULL;
  323.         
  324.         if( tlist != (struct TagItem *) -1L )
  325.         {    
  326.             BPTR    olddir;
  327.         
  328.             if( dirlock ) olddir = CurrentDir( dirlock );
  329.             kprintf( "Calling OpenWorkbenchObjectA()\n" );
  330.             if( OpenWorkbenchObjectA( name, tlist ) )
  331.                 ret = 0UL;
  332.             kprintf( "Returned from OpenWorkbenchObjectA()\n" );
  333.             if( dirlock ) CurrentDir( olddir );
  334.             
  335.             kprintf( "Free: %08lx\n", tlist );
  336.             FreeVec( tlist );
  337.         }        
  338.     }
  339.     
  340.     UnLock( dirlock );
  341.     
  342.     kprintf( "Functions returns %ld\n", ret );
  343.     
  344.     return ret;
  345. }
  346.  
  347. /****************************************************************************/
  348.